#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
#define SAME -1
#define tmtitulo 200
#define tmtipo 100
#define tmautor 125
#define tmano 4
#define tmvalor 12
#define tmimagem 7

  /*
   * Struct utilizada para facililtar a insercao em arquivo os dados de cada obra.
   */
  typedef struct dados {
    char nomes[tmtitulo];
    char tipos[tmtipo];
    char autors[tmautor];
    char anos[tmano];
    char valors[tmvalor];
    char imagems[tmimagem+2];
  } *dados;

  /*
   * Struct utilizada para a insercao em arquivo dos NRR de cada obra, utilizada na chave primaria.
   */
  typedef struct{
    char titulo[200];
    int NRR;
  } PK;

  /*
   * Ponteiro para a struct de arquivo dos NRR de cada obra, utilizada na chave primaria.
   */
  typedef PK* apPK;
  
  typedef struct{
    char titulo[200];
  } titulos;

  typedef titulos* tt;

  typedef struct{
    char autor[200];
  } autores;

  typedef autores* au;

  typedef struct{
    char tipo[200];
  } tipos;

  typedef tipos* tp;

  typedef struct{
    char ano[200];
  } anos;

  typedef anos* an;

  /*
   * Funcao criada para inserir em arquivo cada obra.
   */
  int insere(int *reg,PK *lista,int *nSKtit,int *nSKtip,int *nSKaut,int *nSKano,PK *listaSKtit,PK *listaSKtip,PK *listaSKaut,PK *listaSKano);

  /*
   * Funcao criada para buscar uma obra no arquivo.
   */
  int Busca(PK *lista,int tam);
  
  PK* CarregaPK(int *nu,FILE *arq);
  
  PK* CarregaPKDaBase(int *reg, FILE *arq);
  
  void ADDhtml(dados found);
  
  void Ordena(PK *lista,int inicio,int fim);
  
  void gravaPK(PK *lista, int reg);
  
  void AdicionaPK(PK *lista,char *nome,int reg);

  PK* BSearch(PK *lista,char *busca,int inicio,int fim);

  int VerificaIdent(char *a, char *b);

  PK* CarregaSKDaBase(int *nu, int *nulista, FILE *base, int tamsk, FILE *listainvertida);

  void BuscaSK(PK *lista,int nsk);

  PK* CarregaSK(FILE *SKlist, int *nSK);

  void  AdicionaSK(char *buffer, char *titulo, PK *listaSK, int *nSK, FILE *file, FILE *avail, int tm);

  void gravaSK(FILE *arq, PK *list, int nSK);

  tt BuscaSKtitulo(PK *lista,int nsk,int *cont);

  au BuscaSKautor(PK *lista,int nsk,int *cont);

  tp BuscaSKtipo(PK *lista,int nsk,int *cont);

  an BuscaSKano(PK *lista,int nsk,int *cont);

  int BuscaMain(int escolha,PK *lista,int nsk);
  
  int repete(int total);
